package com.woniuxy.test;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Author author
 * @Create 2023-09-07 14:34
 */
public class App {
    public static void main(String[] args) {
        //使用Proxy动态代理增强
        SomeService someService=new SomeServiceImpl();

//        ClassLoader loader,   类加载器
//        Class<?>[] interfaces,要增强对象所属类型的接口数组的class二进制文件
//        InvocationHandler h    接口，实现要增强的功能。实现这个接口的功能，完成增强

        //代理对象
        SomeService someServiceProxy = (SomeService) Proxy.newProxyInstance(
                someService.getClass().getClassLoader(),
                someService.getClass().getInterfaces(),
                //匿名内部类，本质是就是接口的实现类对象
                new InvocationHandler() {
                    //Object proxy,     代理对象
                    // Method method,   目标方法
                    // Object[] args    目标方法的参数
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        if(method.getName().startsWith("do")){
                            System.out.println("前置通知---记日志");
                            method.invoke(someService, args);
                            System.out.println("后置通知---记日志");
                            return null;
                        }
                        method.invoke(someService, args);
                        return null;
                    }
                }
        );

        someServiceProxy.doSome();
        someServiceProxy.doOther();
        someServiceProxy.test();
        //com.sun.proxy.$Proxy0
//        System.out.println(someServiceProxy.getClass());
//
//        System.out.println(someServiceProxy instanceof SomeService);
//        System.out.println(someServiceProxy instanceof SomeServiceImpl);
    }
}
